home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2000 #4
/
Amiga Plus CD - 2000 - No. 4.iso
/
PowerPC
/
Games
/
Battalion
/
source
/
audio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-23
|
40KB
|
1,301 lines
/****************************************************************/
/* code copyright 1995-1996 Andrew Johnson - ALL RIGHTS RESERVED*/
/* ajohnson@eecs.uic.edu */
/* */
/* Electronic Visualization Lab (M/C 154) */
/* University of Illinois at Chicago */
/* 851 South Morgan St. Room 1120 SEO */
/* Chicago, IL 60607-7053 */
/* */
/* (312) 996-3002 (312) 413-7585 FAX */
/***********************************************************************/
/* audio.c v 1.4 */
/* audio routines for battalion */
/* since audio is so machine dependant there is separate code for the */
/* various implementations ... */
/***********************************************************************/
#include "battalion.h"
#ifdef AMIGAAUDIO
#include "amigasnd.h"
#endif
extern int noSound;
int soundOn;
int musicOn;
extern int showframes;
extern struct monsterInfo Googelon;
/***************/
/* music stuff */
/***************/
int playingTankFire, playingHeloRocket, playingTankMaser;
int playingExplosion, playingSlag, playingTech;
int musicCount, deadCount;
#ifdef SGIAUDIO
struct sound * allSounds;
struct aSound oneSound[MAXSOUNDS];
#endif
#ifdef SUNAUDIO
char *audio_buffer[MAXSOUNDS];
int buffer_counter[MAXSOUNDS];
char *audio_dev = "/dev/audio";
int audiofd;
Audio_hdr file_hdr;
int playingBeam, playingMusic;
#endif
#ifdef AMIGAAUDIO
static struct SoundInfo oneSound[MAXSOUNDS];
int playingBeam, playingMusic;
#endif
#ifdef MACVERSION
int playingBeam, playingCrash, playingMusic, maserOn;
Boolean idleFlag;
Handle beamSound, boomSound, crashSound, monsterbeamSound,
rocketSound, slagSound, tankSound, techSound, musicSound;
long musicRefNum, monsterbeamRefNum, maserbeamRefNum;
SndChannelPtr musicChan, monsterbeamChan, maserbeamChan;
#endif
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* small sound routines to avoid having to use external variables*/
#ifdef MACVERSION
void setSoundVolume(long vol)
{
SetDefaultOutputVolume(vol);
}
#endif
void turnSoundOff()
{
soundOn = 0;
}
void turnSoundOn()
{
soundOn = 1;
}
void toggleSound()
{
soundOn = !soundOn;
}
int getSoundOn()
{
return(soundOn);
}
void turnMusicOff()
{
musicOn = 0;
}
void turnMusicOn()
{
musicOn = 1;
}
void toggleMusic()
{
musicOn = !musicOn;
}
int getMusicOn()
{
return(musicOn);
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void ExitAudio(void)
{
#ifdef AMIGAAUDIO
int i;
for (i=0; i<MAXSOUNDS; i++) {
if (oneSound[i].loaded)
amigasnd_free(&oneSound[i]);
}
amigasnd_exit();
#endif
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void checkSound(char * dataPath)
{
char * garbage;
#ifdef SGIAUDIO
long pvbuf[4];
ALseterrorhandler(0);
pvbuf[0] = AL_OUTPUT_COUNT;
pvbuf[2] = AL_MONITOR_CTL;
if (ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 4) < 0)
{
noSound = 1;
soundOn = 0;
musicOn = 0;
}
if (!noSound)
{
/******************************************/
/* load all the sound effects into memory */
/******************************************/
InitAudio("SOUNDS/beam.aiff", dataPath, 0);
InitAudio("SOUNDS/boom.aiff", dataPath, 1);
InitAudio("SOUNDS/crash.aiff", dataPath, 2);
InitAudio("SOUNDS/monsterbeam.aiff", dataPath, 3);
InitAudio("SOUNDS/rocket.aiff", dataPath, 4);
InitAudio("SOUNDS/slag.aiff", dataPath, 5);
InitAudio("SOUNDS/tank.aiff", dataPath, 6);
InitAudio("SOUNDS/tech.aiff", dataPath, 7);
/*********************************************/
/* load all the background music into memory */
/*********************************************/
InitAudio("MUSIC/1.aiff", dataPath, 10);
InitAudio("MUSIC/2.aiff", dataPath, 11);
InitAudio("MUSIC/3.aiff", dataPath, 12);
InitAudio("MUSIC/4.aiff", dataPath, 13);
InitAudio("MUSIC/5.aiff", dataPath, 14);
InitAudio("MUSIC/d1.aiff", dataPath, 15);
InitAudio("MUSIC/d2.aiff", dataPath, 16);
InitAudio("MUSIC/d3.aiff", dataPath, 17);
InitAudio("MUSIC/d4.aiff", dataPath, 18);
InitAudio("MUSIC/d5.aiff", dataPath, 19);
}
#else
# ifdef SUNAUDIO
/* Solaris audio support */
noSound = 1;
soundOn = 0;
musicOn = 0;
{
/* Check if audio device is available and writable */
struct stat st;
if (stat(audio_dev, &st) >= 0) {
audiofd = open(audio_dev, O_WRONLY);
if (audiofd >= 0) {
noSound = 0;
close(audiofd);
}
}
}
if (!noSound) {
/* Load all sound effects into memory */
InitAudio("SOUNDS/beam.au", dataPath, 0);
InitAudio("SOUNDS/boom.au", dataPath, 1);
InitAudio("SOUNDS/crash.au", dataPath, 2);
InitAudio("SOUNDS/monsterbeam.au", dataPath, 3);
InitAudio("SOUNDS/rocket.au", dataPath, 4);
InitAudio("SOUNDS/slag.au", dataPath, 5);
InitAudio("SOUNDS/tank.au", dataPath, 6);
InitAudio("SOUNDS/tech.au", dataPath, 7);
/* Load all background music into memory */
InitAudio("MUSIC/1.au", dataPath, 10);
InitAudio("MUSIC/2.au", dataPath, 11);
InitAudio("MUSIC/3.au", dataPath, 12);
InitAudio("MUSIC/4.au", dataPath, 13);
InitAudio("MUSIC/5.au", dataPath, 14);
InitAudio("MUSIC/d1.au", dataPath, 15);
InitAudio("MUSIC/d2.au", dataPath, 16);
InitAudio("MUSIC/d3.au", dataPath, 17);
InitAudio("MUSIC/d4.au", dataPath, 18);
InitAudio("MUSIC/d5.au", dataPath, 19);
}
#else
#ifdef AMIGAAUDIO
/* Amiga audio support */
if (amigasnd_init()) {
/* Load all sound effects into memory */
InitAudio("SOUNDS/beam.au", dataPath, 0);
InitAudio("SOUNDS/boom.au", dataPath, 1);
InitAudio("SOUNDS/crash.au", dataPath, 2);
InitAudio("SOUNDS/monsterbeam.au", dataPath, 3);
InitAudio("SOUNDS/rocket.au", dataPath, 4);
InitAudio("SOUNDS/slag.au", dataPath, 5);
InitAudio("SOUNDS/tank.au", dataPath, 6);
InitAudio("SOUNDS/tech.au", dataPath, 7);
/* Load all background music into memory */
InitAudio("MUSIC/1.au", dataPath, 10);
InitAudio("MUSIC/2.au", dataPath, 11);
InitAudio("MUSIC/3.au", dataPath, 12);
InitAudio("MUSIC/4.au", dataPath, 13);
InitAudio("MUSIC/5.au", dataPath, 14);
InitAudio("MUSIC/d1.au", dataPath, 15);
InitAudio("MUSIC/d2.au", dataPath, 16);
InitAudio("MUSIC/d3.au", dataPath, 17);
InitAudio("MUSIC/d4.au", dataPath, 18);
InitAudio("MUSIC/d5.au", dataPath, 19);
atexit(ExitAudio);
}
else {
noSound = 1;
soundOn = 0;
musicOn = 0;
}
#else
#ifdef MACVERSION
SndCommand testCommand;
beamSound = GetResource( 'snd ', 1000 );
boomSound = GetResource( 'snd ', 1001 );
crashSound = GetResource( 'snd ', 1002 );
monsterbeamSound = GetResource( 'snd ', 1003 );
rocketSound = GetResource( 'snd ', 1004 );
slagSound = GetResource( 'snd ', 1005 );
tankSound = GetResource( 'snd ', 1006 );
techSound = GetResource( 'snd ', 1007 );
musicSound = GetResource( 'snd ', 1010 );
noSound = 0;
soundOn = 0;
musicOn = 0;
/* using the SoundHelper code to do asynch audio */
SHInitSoundHelper(&idleFlag, 8);
SHPlayByHandle(musicSound, -1, &musicRefNum);
SHPlayPause(musicRefNum);
SHPlayByHandle(beamSound, -1, &maserbeamRefNum);
SHPlayPause(maserbeamRefNum);
SHPlayByHandle(monsterbeamSound, -1, &monsterbeamRefNum);
SHPlayPause(monsterbeamRefNum);
# else
/* Other than SGI or Solaris or Macintosh*/
noSound = 1;
soundOn = 0;
musicOn = 0;
#endif
#endif
#endif
#endif
garbage = dataPath; /* to avoid compiler warning */
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
#ifdef MACVERSION
void processIdleAppSounds(void)
{
if (idleFlag)
{
SHIdle();
}
}
#endif
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* initialize sound list to empty */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void initSounds()
{
#ifdef SGIAUDIO
register int i;
allSounds = NULL;
allSounds = (struct sound *) calloc(1, sizeof(struct sound));
allSounds->next = NULL;
musicCount = 0;
deadCount = 0;
playingTankFire = playingHeloRocket = playingTankMaser = 0;
playingExplosion = playingSlag = playingTech = 0;
for (i=0; i<MAXSOUNDS; i++)
{
oneSound[i].samplesPerFrame = 0;
oneSound[i].numberSamples = 0;
oneSound[i].samplesPerBuffer = 0;
oneSound[i].audioRate = 0;
oneSound[i].sampleBuffer = NULL;
}
#endif
# ifdef SUNAUDIO
int n;
musicCount = 0;
deadCount = 0;
playingTankFire = playingHeloRocket = playingTankMaser = 0;
playingExplosion = playingSlag = playingTech = 0;
playingBeam = playingMusic = 0;
/* Mark audio buffers as empty */
for (n = 0; n < MAXSOUNDS; n++)
audio_buffer[n] = NULL;
# endif
#ifdef AMIGAAUDIO
musicCount = 0;
deadCount = 0;
playingTankFire = playingHeloRocket = playingTankMaser = 0;
playingExplosion = playingSlag = playingTech = 0;
playingBeam = playingMusic = 0;
memset(oneSound,0,sizeof(struct SoundInfo)*MAXSOUNDS);
#endif
#ifdef MACVERSION
musicCount = 0;
deadCount = 0;
playingTankFire = playingHeloRocket = playingTankMaser = 0;
playingExplosion = playingSlag = playingTech = 0;
playingBeam = playingMusic = maserOn = 0;
playingCrash = 0;
#endif
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* clear all completed sounds from the sound list */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void flushSounds()
{
#ifdef SGIAUDIO
struct sound *s, *t;
playingHeloRocket = playingTech = playingTankMaser = playingSlag = 0;
playingExplosion--;
if (playingExplosion < 0)
playingExplosion = 0;
playingTankFire--;
if (playingTankFire < 0)
playingTankFire = 0;
s = allSounds;
while(s->next != NULL)
{
if(ALgetfilled(s->next->audio_port) <= 0)
{
ALcloseport(s->next->audio_port);
t = s->next;
s->next = s->next->next;
free(t);
}
else
s = s->next;
}
#endif
# ifdef SUNAUDIO
playingHeloRocket = playingTech = playingTankMaser = playingSlag = 0;
playingExplosion--;
if (playingExplosion < 0)
playingExplosion = 0;
playingTankFire--;
if (playingTankFire < 0)
playingTankFire = 0;
playingBeam--;
if (playingBeam < 0)
playingBeam = 0;
playingMusic--;
if (playingMusic < 0)
playingMusic = 0;
# endif
# ifdef AMIGAAUDIO
playingHeloRocket = playingTech = playingTankMaser = playingSlag = 0;
playingExplosion--;
if (playingExplosion < 0)
playingExplosion = 0;
playingTankFire--;
if (playingTankFire < 0)
playingTankFire = 0;
playingBeam--;
if (playingBeam < 0)
playingBeam = 0;
playingMusic--;
if (playingMusic < 0)
playingMusic = 0;
# endif
#ifdef MACVERSION
processIdleAppSounds();
playingTankMaser = playingSlag = 0;
playingHeloRocket--;
if (playingHeloRocket < 0)
playingHeloRocket = 0;
playingCrash--;
if (playingCrash < 0)
playingCrash = 0;
playingExplosion--;
if (playingExplosion < 0)
playingExplosion = 0;
playingTech--;
if (playingTech < 0)
playingTech = 0;
playingTankFire--;
if (playingTankFire < 0)
playingTankFire = 0;
#endif
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* clear all sounds of a given type from the sound list */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void soundKiller(int soundType)
{
int garbage;
#ifdef SGIAUDIO
struct sound * s, *t;
s = allSounds;
while(s->next != NULL)
{
if (s->next->type == soundType)
{
ALcloseport(s->next->audio_port);
t = s->next;
s->next = s->next->next;
free(t);
}
else
s = s->next;
}
#endif
#ifdef MACVERSION
/* stop the sound */
switch (soundType) {
case MUSIC:
/*if (playingMusic)*/
{
/* SHPlayStop(musicRefNum);*/
SHPlayPause(musicRefNum);
playingMusic = 0;
}
break;
case MONSTERBEAM:
/*if (playingBeam)*/
{
/*SHPlayStop(monsterbeamRefNum);*/
SHPlayPause(monsterbeamRefNum);
playingBeam = 0;
}
break;
case TANKMASER:
/* if (maserOn)*/
{
/*SHPlayStop(maserbeamRefNum);*/
SHPlayPause(maserbeamRefNum);
maserOn = 0;
}
break;
}
#endif
garbage = soundType; /* to avoid compiler warning */
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* process a request for a specific sound */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void doSound(int theSound)
{
int garbage;
#ifdef SGIAUDIO
static int deadMusic[MAXDEADMUSIC] = {15, 16, 17, 18, 19};
static int theMusic[MAXMUSIC] = {10, 11, 12, 13, 14};
struct sound * s, *t;
int soundDelay;
if (!noSound)
{
soundDelay = showframes;
if (soundDelay <= 1)
soundDelay = 1;
if (soundDelay > 30)
soundDelay = 30;
if (((theSound == MUSIC) && musicOn) || ((theSound != MUSIC) && soundOn))
{
t = NULL;
switch (theSound){
case MUSIC: s = allSounds->next;
while ((s != NULL) && (t == NULL))
if (s->type == MUSIC)
t = s;
else
s = s->next;
if (Googelon.monsterIsDead)
{
musicCount = 0;
if ((t != NULL) && (deadCount < MAXDEADMUSIC))
{
if ((ALgetfilled(t->audio_port)+oneSound[deadMusic[deadCount]].numberSamples < 2*oneSound[10].samplesPerBuffer) && (deadCount < 3))
{
ALwritesamps(t->audio_port,
oneSound[deadMusic[deadCount]].sampleBuffer,
oneSound[deadMusic[deadCount]].numberSamples);
deadCount = deadCount+1;
}
}
else if (deadCount < MAXDEADMUSIC)
{
OutAudio(deadMusic[deadCount]);
deadCount = deadCount+1;
}
}
else
{
deadCount = 0;
if (t != NULL)
{
if(ALgetfilled(t->audio_port)+oneSound[theMusic[musicCount]].numberSamples < 2*oneSound[10].samplesPerBuffer)
{
ALwritesamps(t->audio_port,
oneSound[theMusic[musicCount]].sampleBuffer,
oneSound[theMusic[musicCount]].numberSamples);
musicCount = (musicCount+1) % MAXMUSIC;
}
}
else
{
OutAudio(theMusic[musicCount]);
musicCount = (musicCount+1) % MAXMUSIC;
}
}
break;
case TANKFIRE: if (!playingTankFire)
{
OutAudio(6);
playingTankFire = soundDelay / 5;
if (playingTankFire < 2)
playingTankFire = 2;
}
break;
case HELOROCKET: if (!playingHeloRocket)
{
OutAudio(4);
playingHeloRocket = 1;
}
break;
case TANKMASER: s = allSounds->next;
while ((s != NULL) && (t == NULL))
if (s->type == TANKMASER)
t = s;
else
s = s->next;
if (t != NULL)
{
if(ALgetfilled(t->audio_port) <= oneSound[0].samplesPerBuffer)
ALwritesamps(t->audio_port,
oneSound[0].sampleBuffer,
oneSound[0].numberSamples);
}
else
OutAudio(0);
break;
case EXPLOSION: if (!playingExplosion)
{
OutAudio(1);
playingExplosion = soundDelay / 5;
if (playingExplosion < 2)
playingExplosion = 2;
}
break;
case MONSTERBEAM: s = allSounds->next;
while ((s != NULL) && (t == NULL))
if (s->type == MONSTERBEAM)
t = s;
else
s = s->next;
if (t != NULL)
{
if(ALgetfilled(t->audio_port) <= oneSound[3].samplesPerBuffer)
ALwritesamps(t->audio_port,
oneSound[3].sampleBuffer,
oneSound[3].numberSamples);
}
else
OutAudio(3);
break;
case SLAG: if (!playingSlag)
{
OutAudio(5);
playingSlag = 1;
}
break;
case CRASH: OutAudio(2);
break;
case TECHSHOOT: if (!playingTech)
{
OutAudio(7);
playingTech = 1;
}
break;
}
}
}
#endif
# ifdef SUNAUDIO
static int deadMusic[MAXDEADMUSIC] = {15, 16, 17, 18, 19};
static int theMusic[MAXMUSIC] = {10, 11, 12, 13, 14};
int soundDelay;
if (!noSound) {
soundDelay = showframes;
if (soundDelay <= 1)
soundDelay = 1;
if (soundDelay > 30)
soundDelay = 30;
if (((theSound == MUSIC) && musicOn) ||
((theSound != MUSIC) && soundOn)) {
switch (theSound) {
case MUSIC:
if (!playingMusic) {
if (Googelon.monsterIsDead) {
musicCount = 0;
OutAudio(deadMusic[deadCount]);
deadCount = (deadCount+1) % MAXDEADMUSIC;
}
else {
deadCount = 0;
OutAudio(theMusic[musicCount]);
musicCount = (musicCount+1) % MAXMUSIC;
}
/* each music sample is 5 secs long */
playingMusic = soundDelay * 5; ;
}
break;
case TANKFIRE:
if (!playingTankFire) {
OutAudio(6);
playingTankFire = soundDelay / 5;
if (playingTankFire < 2)
playingTankFire = 2;
}
break;
case HELOROCKET:
if (!playingHeloRocket) {
OutAudio(4);
playingHeloRocket = 1;
}
break;
case TANKMASER:
OutAudio(0);
break;
case EXPLOSION:
if (!playingExplosion) {
OutAudio(1);
playingExplosion = soundDelay / 5;
if (playingExplosion < 2)
playingExplosion = 2;
}
break;
case MONSTERBEAM:
if (!playingBeam) {
OutAudio(3);
playingBeam = 5 /*soundDelay / 5*/;
}
break;
case SLAG:
if (!playingSlag) {
OutAudio(5);
playingSlag = 1;
}
break;
case CRASH:
OutAudio(2);
break;
case TECHSHOOT:
if (!playingTech) {
OutAudio(7);
playingTech = 1;
}
break;
}
}
}
#endif
#ifdef AMIGAAUDIO
static int deadMusic[MAXDEADMUSIC] = {15, 16, 17, 18, 19};
static int theMusic[MAXMUSIC] = {10, 11, 12, 13, 14};
int soundDelay;
if (!noSound) {
soundDelay = showframes;
if (soundDelay <= 1)
soundDelay = 1;
if (soundDelay > 30)
soundDelay = 30;
if (((theSound == MUSIC) && musicOn) ||
((theSound != MUSIC) && soundOn)) {
switch (theSound) {
case MUSIC:
if (!playingMusic) {
if (Googelon.monsterIsDead) {
musicCount = 0;
OutAudio(deadMusic[deadCount]);
deadCount = (deadCount+1) % MAXDEADMUSIC;
}
else {
deadCount = 0;
OutAudio(theMusic[musicCount]);
musicCount = (musicCount+1) % MAXMUSIC;
}
/* each music sample is 5 secs long */
playingMusic = soundDelay * 5; ;
}
break;
case TANKFIRE:
if (!playingTankFire) {
OutAudio(6);
playingTankFire = soundDelay / 5;
if (playingTankFire < 2)
playingTankFire = 2;
}
break;
case HELOROCKET:
if (!playingHeloRocket) {
OutAudio(4);
playingHeloRocket = 1;
}
break;
case TANKMASER:
OutAudio(0);
break;
case EXPLOSION:
if (!playingExplosion) {
OutAudio(1);
playingExplosion = soundDelay / 5;
if (playingExplosion < 2)
playingExplosion = 2;
}
break;
case MONSTERBEAM:
if (!playingBeam) {
OutAudio(3);
playingBeam = 5 /*soundDelay / 5*/;
}
break;
case SLAG:
if (!playingSlag) {
OutAudio(5);
playingSlag = 1;
}
break;
case CRASH:
OutAudio(2);
break;
case TECHSHOOT:
if (!playingTech) {
OutAudio(7);
playingTech = 1;
}
break;
}
}
}
#endif
/*------------------------ Mac Specific code --------------------*/
#ifdef MACVERSION
int soundDelay;
if (!noSound)
{
soundDelay = showframes;
if (soundDelay <= 1)
soundDelay = 1;
if (soundDelay > 30)
soundDelay = 30;
if (((theSound == MUSIC) && musicOn) || ((theSound != MUSIC) && soundOn))
{
switch (theSound){
case MUSIC: if (!playingMusic)
{
/*SHPlayByHandle(musicSound, &musicRefNum);*/
SHPlayContinue(musicRefNum);
playingMusic = 1;
}
break;
case TANKFIRE:if (!playingTankFire)
{ /* different from sun version */
SHPlayByHandle(tankSound, 1, nil);
playingTankFire = soundDelay / 5;
if (playingTankFire < 3)
playingTankFire = 3;
}
break;
case HELOROCKET:
if (!playingHeloRocket)
{ /* different from sun version */
SHPlayByHandle(rocketSound, 1, nil);
playingHeloRocket = soundDelay / 5;
if (playingHeloRocket < 3)
playingHeloRocket = 3;
}
break;
case TANKMASER:
if (!maserOn)
{
/*SHPlayByHandle(beamSound, &maserbeamRefNum);*/
SHPlayContinue(maserbeamRefNum);
maserOn = 1;
}
break;
case EXPLOSION:
if (!playingExplosion)
{ /* different from sun version */
SHPlayByHandle(boomSound, 1, nil);
playingExplosion = soundDelay / 5;
if (playingExplosion < 3)
playingExplosion = 3;
}
break;
case MONSTERBEAM:
if (!playingBeam)
{
/*SHPlayByHandle(monsterbeamSound, &monsterbeamRefNum);*/
SHPlayContinue(monsterbeamRefNum);
playingBeam = 1;
}
break;
case SLAG:
if (!playingSlag) {
SHPlayByHandle(slagSound, 1, nil);
playingSlag = 1;
}
break;
case CRASH:
if (!playingCrash)
{
SHPlayByHandle(crashSound, 1, nil);
playingCrash = 2;
}
break;
case TECHSHOOT:
if (!playingTech)
{ /* different from sun version */
SHPlayByHandle(techSound, 1, nil);
playingTech = 2;
}
break;
}
}
}
#endif
garbage = theSound;
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* output a particular sound */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void OutAudio(int sCounter)
{
int garbage;
#ifdef SGIAUDIO
ALconfig audioPortConfig;
long pvbuf[4];
long outputRate;
struct sound * s;
pvbuf[0] = AL_OUTPUT_RATE;
ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 2);
if (pvbuf[1] > 0)
outputRate = pvbuf[1];
else
outputRate = AL_RATE_UNDEFINED;
pvbuf[0] = AL_OUTPUT_COUNT;
pvbuf[2] = AL_MONITOR_CTL;
ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 4);
if ((outputRate != oneSound[sCounter].audioRate) || ((pvbuf[1] == 0) && (pvbuf[3] == AL_MONITOR_OFF)))
{
outputRate = oneSound[sCounter].audioRate;
pvbuf[0] = AL_OUTPUT_RATE;
pvbuf[1] = outputRate;
ALsetparams(AL_DEFAULT_DEVICE, pvbuf, 2);
}
audioPortConfig = ALnewconfig();
ALsetwidth(audioPortConfig, AL_SAMPLE_16);
ALsetchannels(audioPortConfig, oneSound[sCounter].samplesPerFrame);
switch(sCounter){
case 1:
case 2:
case 4:
case 5:
case 6:
case 7: ALsetqueuesize(audioPortConfig, oneSound[sCounter].samplesPerBuffer);
break;
case 0:
case 3: ALsetqueuesize(audioPortConfig, 2*oneSound[sCounter].samplesPerBuffer);
break;
default: ALsetqueuesize(audioPortConfig, 3*oneSound[sCounter].samplesPerBuffer);
break;
}
s = (struct sound *) calloc(1, sizeof(struct sound));
if (s != NULL)
{
if (sCounter == 3)
s->type = MONSTERBEAM;
else if (sCounter == 0)
s->type = TANKMASER;
else if (sCounter >= 10)
s->type = MUSIC;
else
s->type = -1;
s->next = allSounds->next;
allSounds->next = s;
s->audio_port = ALopenport("battalion", "w", audioPortConfig);
if (s->audio_port == 0)
{
showError("too many simultaneous sounds");
allSounds->next = s->next;
free(s);
}
else
ALwritesamps(s->audio_port, oneSound[sCounter].sampleBuffer, oneSound[sCounter].numberSamples);
}
#endif
# ifdef SUNAUDIO
static int first = 1;
/* Check if a valid buffer and buffer contains a sample */
if (sCounter < 0 || sCounter >= MAXSOUNDS ||
audio_buffer[sCounter] == NULL)
return;
if (first) {
first = 0;
/* Open audio device */
audiofd = open(audio_dev, O_WRONLY /*| O_NDELAY | O_NONBLOCK*/);
if (audiofd < 0)
return;
}
audio_flush_play(audiofd);
if (write(audiofd, audio_buffer[sCounter], buffer_counter[sCounter]) < 0)
fprintf(stderr, "audio_play: buffer %d failed\n", sCounter);
# endif
#ifdef AMIGAAUDIO
static int chidx = 1; /* channel 0 is reserved for music */
if (sCounter>=0 && sCounter<=MAXSOUNDS) {
/* play sample at next free channel */
amigasnd_play(&oneSound[sCounter],sCounter>=10?0:chidx++);
if (chidx > amigasnd_getchannels())
chidx = 1;
}
#endif
garbage = sCounter; /* to avoid compiler warning */
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* load a particular sound into memory */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
void InitAudio(char * fileName, char * dataPath, int sCounter)
{
char * garbName, * garbPath;
int garbCount;
#ifdef SGIAUDIO
/* IRIX 6 compilers want these next two to be integers
* while IRIS 5 compilers want them to be long ... sheesh */
int bitsPerSample;
int garbage;
long framesPerBuffer;
long framesRead;
FILE * sndtest;
AFfilehandle audioFile;
char textBuffer[80];
char fullPath[MAXPATH];
bitsPerSample = 0;
framesPerBuffer = 0;
garbage = 0;
framesRead = 0;
strcpy(fullPath, dataPath);
strcat(fullPath, fileName);
sndtest = fopen(fullPath, "rb");
if (sndtest == NULL)
{
sprintf(textBuffer, "Could not load %s", fullPath);
showError(textBuffer);
}
else
{
fclose(sndtest);
audioFile = AFopenfile(fullPath, "r", AF_NULL_FILESETUP);
oneSound[sCounter].samplesPerFrame = AFgetchannels(audioFile, AF_DEFAULT_TRACK);
AFgetsampfmt(audioFile, AF_DEFAULT_TRACK, &garbage, &bitsPerSample);
oneSound[sCounter].audioRate = (long) (AFgetrate(audioFile, AF_DEFAULT_TRACK));
if (bitsPerSample != 16)
{
sprintf(textBuffer, "incorrect sound format for %s - should be 16-bits", fileName);
showError(textBuffer);
}
framesPerBuffer = AFgetframecnt(audioFile, AF_DEFAULT_TRACK);
oneSound[sCounter].samplesPerBuffer = framesPerBuffer * oneSound[sCounter].samplesPerFrame;
oneSound[sCounter].sampleBuffer = (short *) calloc((unsigned) oneSound[sCounter].samplesPerBuffer, sizeof(short));
AFseekframe(audioFile, AF_DEFAULT_TRACK, 0);
framesRead = AFreadframes(audioFile, AF_DEFAULT_TRACK, oneSound[sCounter].sampleBuffer, framesPerBuffer);
AFclosefile(audioFile);
oneSound[sCounter].numberSamples = framesRead * oneSound[sCounter].samplesPerFrame;
}
#endif
# ifdef SUNAUDIO
int error;
int count;
char audioFile[MAXPATH];
strcpy(audioFile, dataPath);
strcat(audioFile, fileName);
if ((audiofd = open(audioFile, O_RDONLY, 0)) < 0) {
fprintf(stderr, "audio_load: cannot open %s\n", audioFile);
exit(1);
}
error = audio_read_filehdr(audiofd, &file_hdr, (char *)NULL, 0);
if (error != AUDIO_SUCCESS) {
fprintf(stderr, "audio_load: %s is not a valid audio file\n",
audioFile);
exit(-1);
}
if (audio_buffer[sCounter]) {
free(audio_buffer[sCounter]);
audio_buffer[sCounter] = NULL;
}
audio_buffer[sCounter] = (char *)malloc(file_hdr.data_size);
if ((count = read(audiofd, audio_buffer[sCounter],
file_hdr.data_size)) < 0) {
fprintf(stderr, "audio_load: error reading\n");
close(audiofd);
}
buffer_counter[sCounter] = count;
close(audiofd);
# endif
# ifdef AMIGAAUDIO
char audioFile[MAXPATH];
strcpy(audioFile, dataPath);
strcat(audioFile, fileName);
amigasnd_loadau(&oneSound[sCounter],audioFile);
# endif
garbName = fileName;
garbPath = dataPath;
garbCount = sCounter;
}